package com.ruoyi.system.service.impl;

import java.util.List;

import cn.hutool.core.bean.BeanUtil;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.system.domain.PxAddrBox;
import com.ruoyi.system.domain.PxBoxItem;
import com.ruoyi.system.domain.PxBoxItemDetail;
import com.ruoyi.system.domain.bo.*;
import com.ruoyi.system.domain.bo.SystemUpdateToalPxBoxBo;
import com.ruoyi.system.domain.bo.SystemUpdateTotalPxBoxItemBo;
import com.ruoyi.system.domain.vo.PxBoxItemDetailVo;
import com.ruoyi.system.domain.vo.PxBoxItemVo;
import com.ruoyi.system.domain.vo.PxBoxVo;
import com.ruoyi.system.mapper.PxAddrBoxMapper;
import com.ruoyi.system.mapper.PxBoxItemDetailMapper;
import com.ruoyi.system.mapper.PxBoxItemMapper;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.system.mapper.PxBoxMapper;
import com.ruoyi.system.domain.PxBox;
import com.ruoyi.system.service.IPxBoxService;

/**
 * 拼箱单Service业务层处理
 *
 * @author ruoyi
 * @date 2024-07-02
 */
@Service
public class PxBoxServiceImpl implements IPxBoxService {
    @Autowired
    private PxBoxMapper pxBoxMapper;

    @Autowired
    private PxBoxItemMapper pxBoxItemMapper;

    @Autowired
    private PxBoxItemDetailMapper pxBoxItemDetailMapper;
    @Autowired
    private PxAddrBoxMapper pxAddrBoxMapper;


    /**
     * 查询拼箱单
     *
     * @param boxId 拼箱单主键
     * @return 拼箱单
     */
    @Override
    public PxBoxVo selectPxBoxByBoxId(Long boxId) {
        PxBox pxBox = pxBoxMapper.selectPxBoxByBoxId(boxId);
        if (pxBox != null) {
            return getPxBoxVo(pxBox);
        }


        return null;
    }

    private PxBoxVo getPxBoxVo(PxBox pxBox) {
        PxBoxVo pxBoxVo = new PxBoxVo();
        //pxBox 复制到 pxBoxVo
        BeanUtils.copyProperties(pxBox, pxBoxVo);
        extracted(pxBoxVo);
        return pxBoxVo;
    }

    /**
     * 查询拼箱单列表
     *
     * @param pxBox 拼箱单
     * @return 拼箱单
     */
    @Override
    public List<PxBoxVo> selectPxBoxList(PxBoxBo pxBox) {
        PxBox queryBox = new PxBox();
        BeanUtils.copyProperties(pxBox, queryBox);
        List<PxBox> pxBoxes = pxBoxMapper.selectPxBoxList(queryBox);
        List<PxBoxVo> pxBoxesVo = BeanUtil.copyToList(pxBoxes, PxBoxVo.class);
        for (PxBoxVo pxBoxVo : pxBoxesVo) {
            extracted(pxBoxVo);
        }
        return pxBoxesVo;
    }

    private void extracted(PxBoxVo param) {
        PxBoxItem pxBoxItem = new PxBoxItem();
        pxBoxItem.setBoxId(param.getBoxId());
        List<PxBoxItem> pxBoxItems = pxBoxItemMapper.selectPxBoxItemList(pxBoxItem);
        List<PxBoxItemVo> pxBoxItemVos = BeanUtil.copyToList(pxBoxItems, PxBoxItemVo.class);
        param.setPxBoxItemList(pxBoxItemVos);
        for (PxBoxItemVo pxBoxItem1 : pxBoxItemVos) {
            PxBoxItemDetail pxBoxItemDetail = new PxBoxItemDetail();
            pxBoxItemDetail.setBoxItemId(pxBoxItem1.getBoxItemId());
            List<PxBoxItemDetail> pxBoxItemDetails = pxBoxItemDetailMapper.selectPxBoxItemDetailList(pxBoxItemDetail);
            pxBoxItem1.setPxBoxItemDetails(BeanUtil.copyToList(pxBoxItemDetails, PxBoxItemDetailVo.class));
        }
        PxAddrBox pxAddrBox = new PxAddrBox();
        pxAddrBox.setBoxId(param.getBoxId());
        param.setPxAddrBoxes(pxAddrBoxMapper.selectPxAddrBoxList(pxAddrBox));

    }

    /**
     * 新增拼箱单
     *
     * @param pxBox 拼箱单
     * @return 结果
     */
    @Override
    public int insertPxBox(PxBox pxBox) {
        pxBox.setCreateTime(DateUtils.getNowDate());
        return pxBoxMapper.insertPxBox(pxBox);
    }

    /**
     * 修改拼箱单
     *
     * @param param 拼箱单
     * @return 结果
     */
    @Override
    public int updatePxBox(PxBoxBo param) {
        param.setUpdateTime(DateUtils.getNowDate());
        if (param.getBoxId() != null) {
            PxBox pxBox = new PxBox();
            BeanUtil.copyProperties(param, pxBox);
            pxBoxMapper.updatePxBox(pxBox);
        }
        List<PxBoxItemBo> pxBoxItems = param.getPxBoxItemList();
        if (CollectionUtils.isNotEmpty(pxBoxItems)) {
            pxBoxItems.forEach(pxBoxItem -> {
                PxBoxItem update = new PxBoxItem();
                BeanUtil.copyProperties(pxBoxItem, update);
                pxBoxItemMapper.updatePxBoxItem(update);
                List<PxBoxItemDetailBo> pxBoxItemDetailBos = pxBoxItem.getPxBoxItemDetails();
                if (CollectionUtils.isNotEmpty(pxBoxItemDetailBos)) {
                    pxBoxItemDetailBos.forEach(pxBoxItemDetail -> {
                        PxBoxItemDetail updateBoxItemDetail = new PxBoxItemDetail();
                        BeanUtil.copyProperties(pxBoxItemDetail, updateBoxItemDetail);
                        pxBoxItemDetailMapper.updatePxBoxItemDetail(updateBoxItemDetail);
                    });
                }
            });
        }
        List<PxAddrBox> pxAddrBoxes = param.getPxAddrBoxes();
        if (CollectionUtils.isNotEmpty(pxAddrBoxes)) {
            pxAddrBoxes.forEach(pxAddrBox -> {
                pxAddrBoxMapper.updatePxAddrBox(pxAddrBox);
            });
        }
        return 1;
    }

    /**
     * 批量删除拼箱单
     *
     * @param boxIds 需要删除的拼箱单主键
     * @return 结果
     */
    @Override
    public int deletePxBoxByBoxIds(Integer[] boxIds) {
        return pxBoxMapper.deletePxBoxByBoxIds(boxIds);
    }

    /**
     * 删除拼箱单信息
     *
     * @param boxId 拼箱单主键
     * @return 结果
     */
    @Override
    public int deletePxBoxByBoxId(Integer boxId) {
        return pxBoxMapper.deletePxBoxByBoxId(boxId);
    }

    @Override
    public int editTotal(SystemUpdateToalPxBoxBo param) {
        if (param.getBoxId() != null) {
            PxBox pxBox = new PxBox();
            pxBox.setBoxId(param.getBoxId());
            pxBox.setUpdateTime(DateUtils.getNowDate());
            pxBox.setTotal(param.getTotal());
            pxBox.setUpdateBy(String.valueOf(param.getUserId()));
            pxBoxMapper.updatePxBox(pxBox);
        }
        if (CollectionUtils.isNotEmpty(param.getPxBoxItemList())) {
            for (SystemUpdateTotalPxBoxItemBo updateParam : param.getPxBoxItemList()) {
                PxBoxItem updateItem = new PxBoxItem();
                updateItem.setBoxItemId(updateParam.getBoxItemId());
                updateItem.setUpdateTime(DateUtils.getNowDate());
                updateItem.setTotal(updateParam.getTotal());
                updateItem.setUpdateBy(String.valueOf(param.getUserId()));
                pxBoxItemMapper.updatePxBoxItem(updateItem);
            }
        }
        return 0;
    }

    @Override
    public PxBoxVo selectPxBoxByOrderId(Long orderId) {
        PxBox pxBox = pxBoxMapper.selectPxBoxByOrderId(orderId);
        if (pxBox != null) {
            return getPxBoxVo(pxBox);
        }
        return null;
    }
}
